iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

回傳藍芽狀態

這邊的程式是寫在擴充裡面喔,這邊就是回傳藍芽中央管理器的狀態,而且是遵照CBCentralManagerDelegate協議

extension BluetoothServices: CBCentralManagerDelegate {

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case .unknown:
            print("unknown")
        case .resetting:
            print("resetting")
        case .unsupported:
            print("unsupported")
        case .unauthorized:
            print("unauthorized")
        case .poweredOff:
            print("poweredOff")
        case .poweredOn:
            print("poweredOn")
        @unknown default:
            print("藍芽裝置未知狀態")
        }
        startScan()
    }

這邊比較特別的就是其實狀態處理完後,我們就可以開始掃描藍芽裝置了,再來我們看底下的程式碼

// 發現裝置
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        for newPeripheral in bluePeripherals {
            if peripheral.name == newPeripheral.name {
                return
            }
        }
        if let name = peripheral.name {
            bluePeripherals.append(peripheral)
            print(name)
        }
        delegate?.getBLEPeripherals(peripherals: bluePeripherals)
    }
    
  • peripheral:發現的藍牙裝置

  • 使用 for 循環檢查已發現的裝置(存儲在 bluePeripherals 陣列中),如果發現已存在相同名稱的裝置,則直接返回,避免重複添加。

  • 如果有檢查到新的裝置,就添加到bluePeripherals的陣列裡面

  • 再來就是通過delegate 調用 getBLEPeripherals(peripherals:) 方法,將已發現的裝置列表傳遞出去,這樣可以搭配更新 UI 或進行其他操作。

// 連結裝置
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        peripheral.delegate = self
        peripheral.discoverServices(nil)
    }
  • 設置委託:
    當成功連接到藍牙裝置時,將 peripheral 的委託設置為當前的 BluetoothServices 實例(這樣可以處理後續的服務和特徵)。
  • 發現服務:
    調用 discoverServices(nil) 來發現該裝置的所有可用服務。如果傳遞 nil,表示查詢所有服務。

結論

今天跟大家分享了回傳藍芽裝置的狀態,並把發現的藍芽裝置寫進陣列裡面,設置代理,可以把發現的裝置傳出去,並搭配其他功能使用,還有連接藍芽裝置,並調用discoverServices發現裝置的服務


上一篇
swift 藍芽-掃描與連接
下一篇
swift 藍芽服務與特徵
系列文
Swift大航道-啟航篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言